#ifndef input_kbdev_hpp
#define input_kbdev_hpp

#include <inputmanager.hpp>
#include <utils/event_waiter_frame/event_waiter_frame.hpp>


#define CONTENR_MAX_LENGTH                  (12)
#define CONTENR_MIN_LENGTH                  (8)
   

//UTF-8

/************************类：按键设备整体描述******************/
class input_kbdev_info{
public:

   input_kbdev_info();

   enum input_kbdev_status{
      s_init_idle = 6, // 非忙碌状态, 空闲

      // 忙碌状态
      s_busy_enroll,
      s_busy_auth,
      s_busy_getuserid,
   };

   enum input_kbdev_status cur_function_mode;    // 设备当前所处的功能模式

   unsigned char keysval_content[CONTENR_MAX_LENGTH];  // 键值容器
   unsigned char keys_pressed_count;  //按键计数器

   devfunc_notify* protect; //  设备当前所需要的能提供IPC保护机制的资源

};


/***********************类：注册功能专项描述************************/
class input_kbdev_enroll_paras{
public:
   input_kbdev_enroll_paras();

   enum input_kbdev_enroll_status{ 
      s_enroll_ing = 0, // 正在注册
      s_enroll_not,     // 没在注册 
   };
   int enroll_status;

   enum input_kbdev_enroll_step{
      s_enroll_step1 = 0, // 第一次注册
      s_enroll_step2,     // 第二次注册 
   };
   int enroll_step; //标识第一次注册 还是第二次注册，注册过程需要注册两次

   //unsigned char temp_content[CONTENR_MAX_LENGTH];

   unsigned char first_password[CONTENR_MAX_LENGTH];
   unsigned char first_password_len;

};

void func_enroll_part1(event_waiter_para*p);
void func_enroll_part2(event_waiter_para*p);
void func_enroll_cancelpart2(event_waiter_para*p);

void func_auth_part1(event_waiter_para*p);
void func_auth_part2(event_waiter_para*p);
void func_auth_cancelpart2(event_waiter_para*p);



/***********************类：验证功能专项描述************************/
class input_kbdev_auth_paras{
public:
   input_kbdev_auth_paras();

   enum input_kbdevauth_status{ 
      s_auth_ing = 0, // 正在验证
      s_auth_not,     // 没在验证(验证结束或者还没开始)
   };
   int auth_status;

   unsigned char auth_password[CONTENR_MAX_LENGTH];
   unsigned char auth_password_len;
};




/***********************类：外对接口*************************/
class key_inputdev : public inputmanager{
     
   key_inputdev(); 
   
public:
     /**解释： 
      * 
      * 使用简单工厂模式，具体的设备在执行一次功能的时候，例如执行键盘验证函数内部：
      * 每次都会构造一个键盘，然后执行验证，最后析构。
      * 大量反复的构造和析构，编码时需要考虑的事情就更多了，线程安全，内存泄漏等等。
      * 而实际上，按键这个设备，作为一个功能上永久存在的设备，并不需要被析够掉，
      * 
      * 我选择单例模式，避免对象被多次构造。
      ***/
    ~key_inputdev();
    static key_inputdev* pkey_inputdev_construct_instance();

    static key_inputdev* pkey_inputdev_instance;

     int  suspend(void);
     int  resume(void);

     int enroll( input_dev_param *param);
     int cancel_enroll( input_dev_param *param);

     int authenticate( input_dev_param *param);
     int cancel_authenticate( input_dev_param *param);
    
     int delete_user( input_dev_param *param);
     int cancel_delete_user( input_dev_param *param);   

     // Admin or Usr is deleted by his ID .
     int get_userid( input_dev_param *param);
     int cancel_get_userid( input_dev_param *param);


     int notify_param_handle( input_dev_param *param);
     
     int notify_resource_to_inputdev( input_dev_param *param);
};



#endif

